//+------------------------------------------------------------------+
//|                                                    memoryapi.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <WinAPI/windef.h>
#include <WinAPI/winnt.h>

// 内存资源通知类型
enum MEMORY_RESOURCE_NOTIFICATION_TYPE
{
   LowMemoryResourceNotification,   // 低内存资源通知
   HighMemoryResourceNotification    // 高内存资源通知
};

// 内存分配优先级
enum OFFER_PRIORITY
{
   VmOfferPriorityVeryLow=1,       // 极低优先级
   VmOfferPriorityLow,              // 低优先级
   VmOfferPriorityBelowNormal,       // 低于正常优先级
   VmOfferPriorityNormal             // 正常优先级
};

// 内存信息类别
enum WIN32_MEMORY_INFORMATION_CLASS
{
   MemoryRegionInfo                  // 内存区域信息
};

// 内存范围条目
struct WIN32_MEMORY_RANGE_ENTRY
{
   PVOID VirtualAddress;             // 虚拟地址
   ulong NumberOfBytes;              // 字节数
};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#import "kernel32.dll"
/// 分配用户物理页面
/// @param hProcess 进程句柄
/// @param NumberOfPages 页面数量
/// @param PageArray 页面数组
/// @return 操作结果
int AllocateUserPhysicalPages(HANDLE hProcess, ulong &NumberOfPages, ulong &PageArray[]);

/// 分配用户物理页面(NUMA优化)
/// @param hProcess 进程句柄
/// @param NumberOfPages 页面数量
/// @param PageArray 页面数组
/// @param nndPreferred 首选NUMA节点
/// @return 操作结果
int AllocateUserPhysicalPagesNuma(HANDLE hProcess, ulong &NumberOfPages, ulong &PageArray[], uint nndPreferred);

/// 从应用程序创建文件映射
/// @param hFile 文件句柄
/// @param SecurityAttributes 安全属性
/// @param PageProtection 页面保护
/// @param MaximumSize 最大大小
/// @param Name 映射名称
/// @return 文件映射句柄
HANDLE CreateFileMappingFromApp(HANDLE hFile, PVOID SecurityAttributes, uint PageProtection, ulong MaximumSize, const string Name);

/// 创建文件映射(NUMA优化)
/// @param hFile 文件句柄
/// @param lpFileMappingAttributes 文件映射属性
/// @param flProtect 保护标志
/// @param dwMaximumSizeHigh 最大大小高32位
/// @param dwMaximumSizeLow 最大大小低32位
/// @param lpName 映射名称
/// @param nndPreferred 首选NUMA节点
/// @return 文件映射句柄
HANDLE CreateFileMappingNumaW(HANDLE hFile, PVOID lpFileMappingAttributes, uint flProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, const string lpName, uint nndPreferred);

/// 创建文件映射
/// @param hFile 文件句柄
/// @param lpFileMappingAttributes 文件映射属性
/// @param flProtect 保护标志
/// @param dwMaximumSizeHigh 最大大小高32位
/// @param dwMaximumSizeLow 最大大小低32位
/// @param lpName 映射名称
/// @return 文件映射句柄
HANDLE CreateFileMappingW(HANDLE hFile, PVOID lpFileMappingAttributes, uint flProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, const string lpName);

/// 创建内存资源通知
/// @param NotificationType 通知类型
/// @return 通知句柄
HANDLE CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType);

/// 丢弃虚拟内存
/// @param VirtualAddress 虚拟地址
/// @param Size 大小
/// @return 操作结果
uint DiscardVirtualMemory(PVOID VirtualAddress, ulong Size);

/// 刷新文件视图
/// @param lpBaseAddress 基地址
/// @param dwNumberOfBytesToFlush 要刷新的字节数
/// @return 操作结果
int FlushViewOfFile(const PVOID lpBaseAddress, ulong dwNumberOfBytesToFlush);

/// 释放用户物理页面
/// @param hProcess 进程句柄
/// @param NumberOfPages 页面数量
/// @param PageArray 页面数组
/// @return 操作结果
int FreeUserPhysicalPages(HANDLE hProcess, ulong &NumberOfPages, ulong &PageArray[]);

/// 获取大页面最小值
/// @return 大页面最小大小
ulong GetLargePageMinimum(void);

/// 获取内存错误处理能力
/// @param Capabilities 返回的能力标志
/// @return 操作结果
int GetMemoryErrorHandlingCapabilities(uint &Capabilities);

/// 获取进程工作集大小(扩展)
/// @param hProcess 进程句柄
/// @param lpMinimumWorkingSetSize 最小工作集大小
/// @param lpMaximumWorkingSetSize 最大工作集大小
/// @param Flags 标志位
/// @return 操作结果
int GetProcessWorkingSetSizeEx(HANDLE hProcess, ulong &lpMinimumWorkingSetSize, ulong &lpMaximumWorkingSetSize, uint &Flags);

/// 获取系统文件缓存大小
/// @param lpMinimumFileCacheSize 最小文件缓存大小
/// @param lpMaximumFileCacheSize 最大文件缓存大小
/// @param lpFlags 标志位
/// @return 操作结果
int GetSystemFileCacheSize(ulong &lpMinimumFileCacheSize, ulong &lpMaximumFileCacheSize, uint &lpFlags);

/// 获取写入监视信息
/// @param dwFlags 标志位
/// @param lpBaseAddress 基地址
/// @param dwRegionSize 区域大小
/// @param lpAddresses 地址数组
/// @param lpdwCount 地址计数
/// @param lpdwGranularity 粒度
/// @return 操作结果
uint GetWriteWatch(uint dwFlags, PVOID lpBaseAddress, ulong dwRegionSize, PVOID &lpAddresses[], uint &lpdwCount, uint &lpdwGranularity);

/// 映射用户物理页面
/// @param VirtualAddress 虚拟地址
/// @param NumberOfPages 页面数量
/// @param PageArray 页面数组
/// @return 操作结果
int MapUserPhysicalPages(PVOID VirtualAddress, ulong &NumberOfPages, ulong &PageArray[]);

/// 映射文件视图
/// @param hFileMappingObject 文件映射对象
/// @param dwDesiredAccess 访问权限
/// @param dwFileOffsetHigh 文件偏移高32位
/// @param dwFileOffsetLow 文件偏移低32位
/// @param dwNumberOfBytesToMap 要映射的字节数
/// @return 映射地址
PVOID MapViewOfFile(HANDLE hFileMappingObject, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, ulong dwNumberOfBytesToMap);

/// 映射文件视图(扩展)
/// @param hFileMappingObject 文件映射对象
/// @param dwDesiredAccess 访问权限
/// @param dwFileOffsetHigh 文件偏移高32位
/// @param dwFileOffsetLow 文件偏移低32位
/// @param dwNumberOfBytesToMap 要映射的字节数
/// @param lpBaseAddress 基地址
/// @return 映射地址
PVOID MapViewOfFileEx(HANDLE hFileMappingObject, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, ulong dwNumberOfBytesToMap, PVOID lpBaseAddress);

/// 从应用程序映射文件视图
/// @param hFileMappingObject 文件映射对象
/// @param DesiredAccess 访问权限
/// @param FileOffset 文件偏移
/// @param NumberOfBytesToMap 要映射的字节数
/// @return 映射地址
PVOID MapViewOfFileFromApp(HANDLE hFileMappingObject, uint DesiredAccess, ulong FileOffset, ulong NumberOfBytesToMap);

/// 提供虚拟内存
/// @param VirtualAddress 虚拟地址
/// @param Size 大小
/// @param Priority 优先级
/// @return 操作结果
uint OfferVirtualMemory(PVOID VirtualAddress, ulong Size, OFFER_PRIORITY Priority);

/// 打开文件映射
/// @param dwDesiredAccess 访问权限
/// @param bInheritHandle 是否继承句柄
/// @param lpName 映射名称
/// @return 文件映射句柄
HANDLE OpenFileMappingW(uint dwDesiredAccess, int bInheritHandle, const string lpName);

/// 预取虚拟内存
/// @param hProcess 进程句柄
/// @param NumberOfEntries 条目数
/// @param VirtualAddresses 虚拟地址数组
/// @param Flags 标志位
/// @return 操作结果
int PrefetchVirtualMemory(HANDLE hProcess, uint &NumberOfEntries, WIN32_MEMORY_RANGE_ENTRY &VirtualAddresses, uint Flags);

/// 查询内存资源通知
/// @param ResourceNotificationHandle 通知句柄
/// @param ResourceState 资源状态
/// @return 操作结果
int QueryMemoryResourceNotification(HANDLE ResourceNotificationHandle, int &ResourceState);

/// 读取进程内存
/// @param hProcess 进程句柄
/// @param lpBaseAddress 基地址
/// @param lpBuffer 缓冲区
/// @param nSize 大小
/// @param lpNumberOfBytesRead 读取的字节数
/// @return 操作结果
int ReadProcessMemory(HANDLE hProcess, const PVOID lpBaseAddress, PVOID lpBuffer, ulong nSize, ulong &lpNumberOfBytesRead);

/// 回收虚拟内存
/// @param VirtualAddress 虚拟地址
/// @param Size 大小
/// @return 操作结果
uint ReclaimVirtualMemory(const PVOID VirtualAddress, ulong Size);

/// 注册坏内存通知
/// @param Callback 回调函数
/// @return 注册句柄
PVOID RegisterBadMemoryNotification(PVOID Callback);

/// 重置写入监视
/// @param lpBaseAddress 基地址
/// @param dwRegionSize 区域大小
/// @return 操作结果
uint ResetWriteWatch(PVOID lpBaseAddress, ulong dwRegionSize);

/// 设置进程工作集大小(扩展)
/// @param hProcess 进程句柄
/// @param dwMinimumWorkingSetSize 最小工作集大小
/// @param dwMaximumWorkingSetSize 最大工作集大小
/// @param Flags 标志位
/// @return 操作结果
int SetProcessWorkingSetSizeEx(HANDLE hProcess, ulong dwMinimumWorkingSetSize, ulong dwMaximumWorkingSetSize, uint Flags);

/// 设置系统文件缓存大小
/// @param MinimumFileCacheSize 最小文件缓存大小
/// @param MaximumFileCacheSize 最大文件缓存大小
/// @param Flags 标志位
/// @return 操作结果
int SetSystemFileCacheSize(ulong MinimumFileCacheSize, ulong MaximumFileCacheSize, uint Flags);

/// 取消映射文件视图
/// @param lpBaseAddress 基地址
/// @return 操作结果
int UnmapViewOfFile(const PVOID lpBaseAddress);

/// 取消映射文件视图(扩展)
/// @param BaseAddress 基地址
/// @param UnmapFlags 取消映射标志
/// @return 操作结果
int UnmapViewOfFileEx(PVOID BaseAddress, uint UnmapFlags);

/// 取消注册坏内存通知
/// @param RegistrationHandle 注册句柄
/// @return 操作结果
int UnregisterBadMemoryNotification(PVOID RegistrationHandle);

/// 虚拟分配内存
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param flAllocationType 分配类型
/// @param flProtect 保护属性
/// @return 分配地址
PVOID VirtualAlloc(PVOID lpAddress, ulong dwSize, uint flAllocationType, uint flProtect);

/// 虚拟分配内存(扩展)
/// @param hProcess 进程句柄
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param flAllocationType 分配类型
/// @param flProtect 保护属性
/// @return 分配地址
PVOID VirtualAllocEx(HANDLE hProcess, PVOID lpAddress, ulong dwSize, uint flAllocationType, uint flProtect);

/// 虚拟分配内存(NUMA优化)
/// @param hProcess 进程句柄
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param flAllocationType 分配类型
/// @param flProtect 保护属性
/// @param nndPreferred 首选NUMA节点
/// @return 分配地址
PVOID VirtualAllocExNuma(HANDLE hProcess, PVOID lpAddress, ulong dwSize, uint flAllocationType, uint flProtect, uint nndPreferred);

/// 释放虚拟内存
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param dwFreeType 释放类型
/// @return 操作结果
int VirtualFree(PVOID lpAddress, ulong dwSize, uint dwFreeType);

/// 释放虚拟内存(扩展)
/// @param hProcess 进程句柄
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param dwFreeType 释放类型
/// @return 操作结果
int VirtualFreeEx(HANDLE hProcess, PVOID lpAddress, ulong dwSize, uint dwFreeType);

/// 锁定虚拟内存
/// @param lpAddress 地址
/// @param dwSize 大小
/// @return 操作结果
int VirtualLock(PVOID lpAddress, ulong dwSize);

/// 设置虚拟内存保护
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param flNewProtect 新保护属性
/// @param lpflOldProtect 旧保护属性
/// @return 操作结果
int VirtualProtect(PVOID lpAddress, ulong dwSize, uint flNewProtect, uint &lpflOldProtect);

/// 设置虚拟内存保护(扩展)
/// @param hProcess 进程句柄
/// @param lpAddress 地址
/// @param dwSize 大小
/// @param flNewProtect 新保护属性
/// @param lpflOldProtect 旧保护属性
/// @return 操作结果
int VirtualProtectEx(HANDLE hProcess, PVOID lpAddress, ulong dwSize, uint flNewProtect, uint &lpflOldProtect);

/// 查询虚拟内存
/// @param lpAddress 地址
/// @param lpBuffer 缓冲区
/// @param dwLength 长度
/// @return 操作结果
ulong VirtualQuery(const PVOID lpAddress, MEMORY_BASIC_INFORMATION &lpBuffer, ulong dwLength);

/// 查询虚拟内存(扩展)
/// @param hProcess 进程句柄
/// @param lpAddress 地址
/// @param lpBuffer 缓冲区
/// @param dwLength 长度
/// @return 操作结果
ulong VirtualQueryEx(HANDLE hProcess, const PVOID lpAddress, MEMORY_BASIC_INFORMATION &lpBuffer, ulong dwLength);

/// 解锁虚拟内存
/// @param lpAddress 地址
/// @param dwSize 大小
/// @return 操作结果
int VirtualUnlock(PVOID lpAddress, ulong dwSize);

/// 写入进程内存
/// @param hProcess 进程句柄
/// @param lpBaseAddress 基地址
/// @param lpBuffer 缓冲区
/// @param nSize 大小
/// @param lpNumberOfBytesWritten 写入的字节数
/// @return 操作结果
int WriteProcessMemory(HANDLE hProcess, PVOID lpBaseAddress, PVOID lpBuffer, ulong nSize, ulong &lpNumberOfBytesWritten);

/// 写入进程内存(字节数组版本)
/// @param hProcess 进程句柄
/// @param lpBaseAddress 基地址
/// @param lpBuffer 字节数组缓冲区
/// @param nSize 大小
/// @param lpNumberOfBytesWritten 写入的字节数
/// @return 操作结果
int WriteProcessMemory(HANDLE hProcess, PVOID lpBaseAddress, uchar &lpBuffer[], ulong nSize, ulong &lpNumberOfBytesWritten);

/// 写入进程内存(混合地址版本)
/// @param hProcess 进程句柄
/// @param lpBaseAddress 字节数组基地址
/// @param lpBuffer 缓冲区
/// @param nSize 大小
/// @param lpNumberOfBytesWritten 写入的字节数
/// @return 操作结果
int WriteProcessMemory(HANDLE hProcess, uchar &lpBaseAddress[], PVOID lpBuffer, ulong nSize, ulong &lpNumberOfBytesWritten);

/// 写入进程内存(双字节数组版本)
/// @param hProcess 进程句柄
/// @param lpBaseAddress 字节数组基地址
/// @param lpBuffer 字节数组缓冲区
/// @param nSize 大小
/// @param lpNumberOfBytesWritten 写入的字节数
/// @return 操作结果
int WriteProcessMemory(HANDLE hProcess, uchar &lpBaseAddress[], uchar &lpBuffer[], ulong nSize, ulong &lpNumberOfBytesWritten);
#import
//+------------------------------------------------------------------+